/*
 * UAE - The Un*x Amiga Emulator
 *
 * Stuff
 *
 * Copyright 1995, 1996 Ed Hanway
 * Copyright 1995-2001 Bernd Schmidt
 */

#pragma once

// #define UAEMAJOR 2
// #define UAEMINOR 3
// #define UAESUBREV 2

// typedef enum { KBD_LANG_US, KBD_LANG_DK, KBD_LANG_DE, KBD_LANG_SE, KBD_LANG_FR, KBD_LANG_IT, KBD_LANG_ES } KbdLang;

extern long int version;

// #define MAX_PATHS 8
//
// struct multipath
// {
//     TCHAR path[MAX_PATHS][256];
// };
//
// struct strlist
// {
//     struct strlist* next;
//     TCHAR* option, * value;
//     int unknown;
// };
//
// #define MAX_TOTAL_SCSI_DEVICES 8
//
// /* maximum number native input devices supported (single type) */
// #define MAX_INPUT_DEVICES 8
// /* maximum number of native input device's buttons and axles supported */
// #define MAX_INPUT_DEVICE_EVENTS 256
// /* 4 different customization settings */
// #define MAX_INPUT_SETTINGS 4
// #define GAMEPORT_INPUT_SETTINGS 3 // last slot is for gameport panel mappings
// #define MAX_INPUT_SUB_EVENT 4
// #define SPARE_SUB_EVENT 4
//
// struct uae_input_device
// {
//     TCHAR* name;
//     TCHAR* configname;
//     short eventid[MAX_INPUT_DEVICE_EVENTS][MAX_INPUT_SUB_EVENT + 1];
//     TCHAR* custom[MAX_INPUT_DEVICE_EVENTS][MAX_INPUT_SUB_EVENT + 1];
//     ushort flags[MAX_INPUT_DEVICE_EVENTS][MAX_INPUT_SUB_EVENT + 1];
//     sbyte port[MAX_INPUT_DEVICE_EVENTS][MAX_INPUT_SUB_EVENT + 1];
//     short extra[MAX_INPUT_DEVICE_EVENTS];
//     sbyte enabled;
// };
//
// #define MAX_JPORTS 4
// #define NORMAL_JPORTS 2
// #define MAX_JPORTNAME 128
// struct jport
// {
//     int id;
//     int mode; // 0=def,1=mouse,2=joy,3=anajoy,4=lightpen
//     int autofire;
//     TCHAR name[MAX_JPORTNAME];
//     TCHAR configname[MAX_JPORTNAME];
// };
// #define JPORT_NONE -1
// #define JPORT_CUSTOM -2
// #define JPORT_AF_NORMAL 1
// #define JPORT_AF_TOGGLE 2
//
// #define MAX_SPARE_DRIVES 20
// #define MAX_CUSTOM_MEMORY_ADDRS 2

#define CONFIG_TYPE_HARDWARE 1
#define CONFIG_TYPE_HOST 2
#define CONFIG_BLEN 2560

// struct cdslot
// {
//     TCHAR name[MAX_DPATH];
//     bool inuse;
//     bool delayed;
//     int type;
// };
//
// struct FloppySlot
// {
//     CString df;
//     int dfxtype;
//     int dfxclick;
//     TCHAR dfxclickexternal[256];
// };
//
// struct wh
// {
//     int x, y;
//     int width, height;
// };
//
// #define MOUNT_CONFIG_SIZE 30
// struct DeviceConfigInfo
// {
//     TCHAR devname[MAX_DPATH];
//     TCHAR volname[MAX_DPATH];
//     TCHAR rootdir[MAX_DPATH];
//     bool ishdf;
//     bool readonly;
//     int bootpri;
//     bool autoboot;
//     bool donotmount;
//     TCHAR filesys[MAX_DPATH];
//     int surfaces;
//     int sectors;
//     int reserved;
//     int blocksize;
//     int configoffset;
//     int controller;
// };

enum
{
    CP_CDTV= 1,
    CP_CD32,
    CP_A500,
    CP_A500P,
    CP_A600,
    CP_A1000,
    CP_A1200,
    CP_A3000,
    CP_A4000
};

#define IDE_A600A1200 1
#define IDE_A4000 2

// #define GFX_WINDOW 0
// #define GFX_FULLSCREEN 1
// #define GFX_FULLWINDOW 2

#define AUTOSCALE_NONE 0
// #define AUTOSCALE_STATIC_AUTO 1
// #define AUTOSCALE_STATIC_NOMINAL 2
// #define AUTOSCALE_STATIC_MAX 3
#define AUTOSCALE_NORMAL 4
#define AUTOSCALE_RESIZE 5
// #define AUTOSCALE_CENTER 6
// #define AUTOSCALE_MANUAL 7 // use gfx_xcenter_pos and gfx_ycenter_pos

// struct CConfiguration
// {
//
//     struct strlist* all_lines;
//
//     TCHAR description[256];
//     TCHAR info[256];
//     int config_version;
//     TCHAR config_hardware_path[MAX_DPATH];
//     TCHAR config_host_path[MAX_DPATH];
//
//     bool illegal_mem;
//     bool use_serial;
//     bool serial_demand;
//     bool serial_hwctsrts;
//     bool serial_direct;
//     bool parallel_demand;
//     int parallel_matrix_emulation;
//     bool parallel_postscript_emulation;
//     bool parallel_postscript_detection;
//     int parallel_autoflush_time;
//     TCHAR ghostscript_parameters[256];
//     bool use_gfxlib;
//     bool socket_emu;
//
//     bool start_debugger;
//     bool start_gui;
//
//     KbdLang keyboard_lang;
//
//     bool sound_produce;
//     int sound_stereo;
//     int sound_stereo_separation;
//     int sound_mixed_stereo_delay;
//     int sound_freq;
//     int sound_maxbsiz;
//     int sound_latency;
//     int sound_interpol;
//     int sound_filter;
//     int sound_filter_type;
//     int sound_volume;
//     bool sound_stereo_swap_paula;
//     bool sound_stereo_swap_ahi;
//     bool sound_auto;
//
//     int comptrustbyte;
//     int comptrustword;
//     int comptrustlong;
//     int comptrustnaddr;
//     bool jit_no_flags;
//     bool jit_fpu;
//     bool comp_midopt;
//     bool comp_lowopt;
//     bool jit_fpu_more_compatible;
//
//     bool jit_hard_flush;
//     bool jit_const_jump;
//     bool comp_oldsegv;
//
//     int jit_cache_size;
//     int jit_optcount[10];
//
//     bool avoid_cmov;
//
//     int gfx_display;
//     TCHAR gfx_display_name[256];
//     int gfx_framerate, gfx_autoframerate;
//     struct wh gfx_size_win;
//     struct wh gfx_size_fs;
//     struct wh gfx_size;
//     struct wh gfx_size_win_xtra[6];
//     struct wh gfx_size_fs_xtra[6];
//     bool gfx_autoresolution;
//     bool gfx_scandoubler;
//     int gfx_refreshrate;
//     int gfx_avsync, gfx_pvsync;
//     int gfx_resolution;
//     int gfx_vresolution;
//     int gfx_lores_mode;
//     int gfx_scanlines;
//     int gfx_afullscreen, gfx_pfullscreen;
//     int gfx_xcenter, gfx_ycenter;
//     int gfx_xcenter_pos, gfx_ycenter_pos;
//     int gfx_xcenter_size, gfx_ycenter_size;
//     int gfx_max_horizontal, gfx_max_vertical;
//     int gfx_saturation, gfx_luminance, gfx_contrast, gfx_gamma;
//     bool gfx_blackerthanblack;
//     int gfx_backbuffers;
//     int gfx_api;
//     int color_mode;
//
//     int gfx_filter;
//     TCHAR gfx_filtershader[MAX_DPATH];
//     TCHAR gfx_filtermask[MAX_DPATH];
//     TCHAR gfx_filteroverlay[MAX_DPATH];
//     struct wh gfx_filteroverlay_pos;
//     int gfx_filteroverlay_overscan;
//     int gfx_filter_scanlines;
//     int gfx_filter_scanlineratio;
//     int gfx_filter_scanlinelevel;
//     int gfx_filter_horiz_zoom, gfx_filter_vert_zoom;
//     int gfx_filter_horiz_zoom_mult, gfx_filter_vert_zoom_mult;
//     int gfx_filter_horiz_offset, gfx_filter_vert_offset;
//     int gfx_filter_filtermode;
//     int gfx_filter_bilinear;
//     int gfx_filter_noise, gfx_filter_blur;
//     int gfx_filter_saturation, gfx_filter_luminance, gfx_filter_contrast, gfx_filter_gamma;
//     int gfx_filter_keep_aspect, gfx_filter_aspect;
//     int gfx_filter_autoscale;
//
//     bool immediate_blits;
//     uint chipset_mask;
//     bool ntscmode;
//     bool genlock;
//     int chipset_refreshrate;
//     int collision_level;
//     int leds_on_screen;
//     int keyboard_leds[3];
//     bool keyboard_leds_in_use;
//     int scsi;
//     bool sana2;
//     bool uaeserial;
//     int catweasel;
//     int cpu_idle;
//     bool cpu_cycle_exact;
//     int cpu_clock_multiplier;
//     int cpu_frequency;
//     bool blitter_cycle_exact;
//     int floppy_speed;
//     int floppy_write_length;
//     int floppy_random_bits_min;
//     int floppy_random_bits_max;
//     bool tod_hack;
//     uint maprom;
//     int turbo_emulation;
//     bool headless;
//
//     int cs_compatible;
//     int cs_ciaatod;
//     int cs_rtc;
//     //int cs_rtc_adjust;
//     int cs_rtc_adjust_mode;
//     bool cs_ksmirror_e0;
//     bool cs_ksmirror_a8;
//     bool cs_ciaoverlay;
//     bool cs_cd32cd;
//     bool cs_cd32c2p;
//     bool cs_cd32nvram;
//     bool cs_cdtvcd;
//     bool cs_cdtvram;
//     int cs_cdtvcard;
//     int cs_ide;
//     bool cs_pcmcia;
//     bool cs_a1000ram;
//     int cs_fatgaryrev;
//     int cs_ramseyrev;
//     //int cs_agnusrev;
//     //int cs_deniserev;
//     int cs_mbdmac;
//     bool cs_cdtvscsi;
//     bool cs_a2091, cs_a4091;
//     bool cs_df0idhw;
//     bool cs_slowmemisfast;
//     bool cs_resetwarning;
//     bool cs_denisenoehb;
//     bool cs_dipagnus;
//     bool cs_agnusbltbusybug;
//
//     TCHAR romfile[MAX_DPATH];
//     TCHAR romident[256];
//     TCHAR romextfile[MAX_DPATH];
//     uint romextfile2addr;
//     TCHAR romextfile2[MAX_DPATH];
//     TCHAR romextident[256];
//     TCHAR flashfile[MAX_DPATH];
//     TCHAR cartfile[MAX_DPATH];
//     TCHAR cartident[256];
//     int cart_internal;
//     TCHAR pci_devices[256];
//     TCHAR prtname[256];
//     TCHAR sername[256];
//     TCHAR amaxromfile[MAX_DPATH];
//     TCHAR a2065name[MAX_DPATH];
//     struct cdslot cdslots[MAX_TOTAL_SCSI_DEVICES];
//     TCHAR quitstatefile[MAX_DPATH];
//     TCHAR statefile[MAX_DPATH];
//     TCHAR inprecfile[MAX_DPATH];
//     bool inprec_autoplay;
//
//     struct multipath path_floppy;
//     struct multipath path_hardfile;
//     struct multipath path_rom;
//     struct multipath path_cd;
//
//     int m68k_speed;
//     int cpu_model;
//     int mmu_model;
//     int cpu060_revision;
//     int fpu_model;
//     int fpu_revision;
//     bool cpu_compatible;
//     bool address_space_24;
//     bool picasso96_nocustom;
//     int picasso96_modeflags;
//
//     uint z3fastmem_size, z3fastmem2_size;
//     uint z3fastmem_start;
//     uint z3chipmem_size;
//     uint z3chipmem_start;
//     uint fastmem_size;
//     uint chipmem_size;
//     uint bogomem_size;
//     uint mbresmem_low_size;
//     uint mbresmem_high_size;
//     uint gfxmem_size;
//     uint custom_memory_addrs[MAX_CUSTOM_MEMORY_ADDRS];
//     uint custom_memory_sizes[MAX_CUSTOM_MEMORY_ADDRS];
//
//     bool kickshifter;
//     bool filesys_no_uaefsdb;
//     bool filesys_custom_uaefsdb;
//     bool mmkeyboard;
//     int uae_hide;
//     bool clipboard_sharing;
//
//     int mountitems;
//     struct DeviceConfigInfo mounted_devices[MOUNT_CONFIG_SIZE];
//
//     int nr_floppies;
//     struct FloppySlot floppies[4];
//     TCHAR dfxlist[MAX_SPARE_DRIVES][MAX_DPATH];
//     int dfxclickvolume;
//     int dfxclickchannelmask;
//
//     /* Target specific options */
//
//     bool win32_middle_mouse;
//     bool win32_logfile;
//     bool win32_notaskbarbutton;
//     bool win32_alwaysontop;
//     bool win32_powersavedisabled;
//     bool win32_minimize_inactive;
//     int win32_statusbar;
//
//     int win32_active_priority;
//     int win32_inactive_priority;
//     bool win32_inactive_pause;
//     bool win32_inactive_nosound;
//     int win32_iconified_priority;
//     bool win32_iconified_pause;
//     bool win32_iconified_nosound;
//
//     bool win32_rtgmatchdepth;
//     bool win32_rtgscaleifsmall;
//     bool win32_rtgallowscaling;
//     int win32_rtgscaleaspectratio;
//     int win32_rtgvblankrate;
//     bool win32_borderless;
//     bool win32_ctrl_F11_is_quit;
//     bool win32_automount_removable;
//     bool win32_automount_drives;
//     bool win32_automount_cddrives;
//     bool win32_automount_netdrives;
//     bool win32_automount_removabledrives;
//     int win32_midioutdev;
//     int win32_midiindev;
//     int win32_uaescsimode;
//     int win32_soundcard;
//     int win32_samplersoundcard;
//     bool win32_soundexclusive;
//     bool win32_norecyclebin;
//     int win32_specialkey;
//     int win32_guikey;
//     int win32_kbledmode;
//     TCHAR win32_commandpathstart[MAX_DPATH];
//     TCHAR win32_commandpathend[MAX_DPATH];
//     TCHAR win32_parjoyport0[MAX_DPATH];
//     TCHAR win32_parjoyport1[MAX_DPATH];
//
//     int statecapturerate, statecapturebuffersize;
//
//     /* input */
//
//     struct jport jports[MAX_JPORTS];
//     int input_selected_setting;
//     int input_joymouse_multiplier;
//     int input_joymouse_deadzone;
//     int input_joystick_deadzone;
//     int input_joymouse_speed;
//     int input_analog_joystick_mult;
//     int input_analog_joystick_offset;
//     int input_autofire_linecnt;
//     int input_mouse_speed;
//     bool input_virtual_mouse;
//     bool input_magic_mouse;
//     int input_magic_mouse_cursor;
//     struct uae_input_device joystick_settings[MAX_INPUT_SETTINGS][MAX_INPUT_DEVICES];
//     struct uae_input_device mouse_settings[MAX_INPUT_SETTINGS][MAX_INPUT_DEVICES];
//     struct uae_input_device keyboard_settings[MAX_INPUT_SETTINGS][MAX_INPUT_DEVICES];
//     int dongle;
//     int input_contact_bounce;
// };

extern int config_changed;
extern void config_check_vsync();

/* Contains the filename of .uaerc */
// extern TCHAR optionsfile[];
extern void save_options(struct zfile*, CConfiguration*, int);

extern void cfgfile_write(struct zfile*, const TCHAR* option, const TCHAR* format, ...);
extern void cfgfile_dwrite(struct zfile*, const TCHAR* option, const TCHAR* format, ...);
extern void cfgfile_target_write(struct zfile*, const TCHAR* option, const TCHAR* format, ...);
extern void cfgfile_target_dwrite(struct zfile*, const TCHAR* option, const TCHAR* format, ...);

extern void cfgfile_write_bool(struct zfile* f, const TCHAR* option, bool b);
extern void cfgfile_dwrite_bool(struct zfile* f, const TCHAR* option, bool b);
extern void cfgfile_target_write_bool(struct zfile* f, const TCHAR* option, bool b);
extern void cfgfile_target_dwrite_bool(struct zfile* f, const TCHAR* option, bool b);

extern void cfgfile_write_str(struct zfile* f, const TCHAR* option, const TCHAR* value);
extern void cfgfile_dwrite_str(struct zfile* f, const TCHAR* option, const TCHAR* value);
extern void cfgfile_target_write_str(struct zfile* f, const TCHAR* option, const TCHAR* value);
extern void cfgfile_target_dwrite_str(struct zfile* f, const TCHAR* option, const TCHAR* value);

extern void cfgfile_backup(const TCHAR* path);
extern struct DeviceConfigInfo* add_filesys_config(CConfiguration* p, int index,
    TCHAR* devname, TCHAR* volname, TCHAR* rootdir, bool readonly,
    int secspertrack, int surfaces, int reserved,
    int blocksize, int bootpri, TCHAR* filesysdir, int hdc);

// extern void default_prefs(CConfiguration*, int);
// extern void discard_prefs(CConfiguration*, int);

int parse_cmdline_option(CConfiguration * conf, TCHAR);

extern int cfgfile_yesno(const TCHAR* option, const TCHAR* value, const TCHAR* name, bool* location);
extern int cfgfile_intval(const TCHAR* option, const TCHAR* value, const TCHAR* name, int* location, int scale);
extern int cfgfile_strval(const TCHAR* option, const TCHAR* value, const TCHAR* name, int* location, const TCHAR* table[], int more);
extern int cfgfile_string(const TCHAR* option, const TCHAR* value, const TCHAR* name, TCHAR* location, int maxsz);
extern int cfgfile_string(const TCHAR* option, const TCHAR* value, const TCHAR* name, CString* p);
// extern TCHAR * cfgfile_subst_path(const TCHAR* path, const TCHAR* subst, const TCHAR* file);
extern TCHAR* target_expand_environment(const TCHAR* path);
extern int target_parse_option(CConfiguration*, const TCHAR* option, const TCHAR* value);
extern void target_save_options(struct zfile*, CConfiguration*);
extern void target_default_options(CConfiguration*, int type);
// extern void target_fixup_options(CConfiguration*);
extern int target_cfgfile_load(CConfiguration*, const TCHAR* filename, int type, int isdefault);
extern void cfgfile_save_options(struct zfile* f, CConfiguration* p, int type);
extern int cfgfile_load(CConfiguration* p, const TCHAR* filename, int* type, int ignorelink, int userconfig);
extern int cfgfile_save(CConfiguration* p, const TCHAR* filename, int);
extern void cfgfile_parse_line(CConfiguration* p, TCHAR*, int);
extern void cfgfile_parse_lines(CConfiguration* p, const TCHAR*, int);
extern int cfgfile_parse_option(CConfiguration* p, TCHAR* option, TCHAR* value, int);
extern int cfgfile_get_description(const TCHAR* filename, TCHAR* description, TCHAR* hostlink, TCHAR* hardwarelink, int* type);
// extern void cfgfile_show_usage();
// extern uint cfgfile_uaelib(int mode, uint name, uint dst, uint maxlen);
extern uint cfgfile_uaelib_modify(uint mode, uint parms, uint size, uint out, uint outsize);
extern uint cfgfile_modify(uint index, TCHAR* parms, uint size, TCHAR* out, uint outsize);
// extern void cfgfile_addcfgparam(TCHAR*);
extern int built_in_prefs(CConfiguration* p, int model, int config, int compa, int romcheck);
// extern int built_in_chipset_prefs(CConfiguration* p);
extern int cmdlineparser(const TCHAR * s, TCHAR * outp[], int max);
extern int cfgfile_configuration_change(int);
extern void fixup_prefs_dimensions(CConfiguration* prefs);
extern void fixup_prefs(CConfiguration* prefs);
extern void fixup_cpu(CConfiguration* prefs);

extern int machdep_init();
// extern void machdep_free();

extern void check_prefs_changed_custom();
extern void check_prefs_changed_cpu();
extern void check_prefs_changed_audio();
extern int check_prefs_changed_gfx();

void default_prefs(CConfiguration* conf);
int built_in_chipset_prefs(CConfiguration* conf);